3W - 트래픽 미러링 패킷 캡쳐
개요
이번에는 조금 더 심화된 내용으로, 트래픽을 미러링하는 방법을 알아본다.
이 내용만 다루지만, 대신 조금 자세하게 패킷을 캡쳐해서 어떤 식으로 미러링 기능이 동작하는지 볼 것이다.
사전 지식
트래픽 미러링이란
트래픽 미러링은 라우팅될 트래픽을 그대로 복사하여 다른 곳으로도 보내는 기법을 말한다.
복사된 트래픽을 받은 입장에서는 일반적으로 트래픽이 온 것으로 간주하고 응답을 보내지만, 트래픽을 보낸 엔보이는 해당 응답을 무시한다.
새로운 배포 버전을 릴리스할 때 이 방식을 사용하면 실제 사용자의 트래픽을 이용해서 테스트를 하면서도 사용자의 요청은 안정적인 버전으로 그대로 유지시킬 수 있다는 장점이 있다.
실습 진행
미러링 세팅
kubectl apply -f services/catalog/kubernetes/catalog-svc.yaml -n istioinaction
kubectl apply -f services/catalog/kubernetes/catalog-deployment.yaml -n istioinaction
kubectl apply -f services/catalog/kubernetes/catalog-deployment-v2.yaml -n istioinaction
kubectl apply -f ch5/catalog-dest-rule.yaml -n istioinaction
kubectl apply -f ch5/catalog-vs-v1-mesh.yaml -n istioinaction
다시 환경을 세팅한다.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: catalog
spec:
hosts:
- catalog
gateways:
- mesh
http:
- route:
- destination:
host: catalog
subset: version-v1
weight: 100
mirror:
host: catalog
subset: version-v2
mirror
필드를 세팅하면 간단하게 트래픽을 미러링할 수 있게 된다.
webapp 엔보이의 라우팅 설정을 보면 requestMirrorPolicies
가 생긴 것을 볼 수 있다.
키알리 상으로도 각 버전에 트래픽을 똑같이 보내는 것이 확인된다.
이때 시각화에서 버튼에서 리퀘스트의 throughput을 보면 v2에는 데이터가 집계되지 않는 것을 확인할 수 있다.
kubectl logs -n istioinaction -l app=catalog -l version=v2 -c catalog -f
미러 트래픽을 받는 어플리케이션의 로그를 보면 호스트에 -shadow
라는 값이 붙는 것을 볼 수 있다.
미러 트래픽을 받는 쪽에 이 정도의 단서를 제공해주긴 하기 때문에 실제 운영 시에는 이걸 활용해 받는 쪽에서 어떻게 처리할지 조금 더 세부적으로 지정할 수 있다.
그나저나 내가 뭘 또 잘못한 것인지, 미러링되고 있다는 아이콘이 표시되지는 않았다.
미러링 패킷 확인
노드 단에서 확인
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: DISABLE
조금 더 확실하게 보기 위해서 아예 패킷 덤프를 떠보자.
일단 데이터 상태 확인을 위해 mtls를 비활성화한다.
docker exec myk8s-control-plane tcpdump -i any -c 1000 -w /istiobook/capture.pcap
컨트롤 플레인만 있으므로 패킷을 확인하는 작업이 상대적으로 쉽다.
패킷을 그대로 떠서 호스트로 마운팅 되고 있는 경로에 저장해서 구경해보면..
http 트래픽만 걸러서 보면 미러링되고 있는 트래픽 정보를 금새 확인할 수 있다.
참고로 각 파드의 ip도 정확하게 일치한다.
미러링된 요청의 응답을 무시한다는 것이 아예 tcp 연결을 끊어버리는 건가 했는데, 그건 아니고 분명히 응답을 받긴 하고 그걸 사용하지 않는다는 의미로 이해하면 되겠다.
다시 말해 미러링을 한 엔보이는 미러 응답을 자신의 어플리케이션에 돌려보내지 않는다는 말이다.
k run debug --image nicolaka/netshoot -ti -- zsh
curl catalog/items
아예 디버깅 파드를 띄워서 패킷도 캡쳐해봤다.
내부 패킷 상으로도 정상적으로 미러 응답이 들어온다.
컨테이너 내부에서 확인
이렇게만 보려니 뭔가 아쉽다.
아예 컨테이너 내부에서 일어나는 패킷을 뜯어서 보자.
apiVersion: v1
kind: Pod
metadata:
name: debug
spec:
volumes:
- name: local
hostPath:
path: "/istiobook"
containers:
- name: debug
image: nicolaka/netshoot
command: [sh, -c, "sleep 60d"]
volumeMounts:
- mountPath: /istiobook
name: local
terminationGracePeriodSeconds: 0
디버깅 파드에 호스트패스 볼륨을 두어 패킷 덤프 파일을 꺼내 볼 수 있게 만들었다.
keti debug -- tcpdump -i any -c 40 -w /istiobook/localhost.pcap
keti debug -- curl catalog/items
이 상태에서 두어번 요청을 보낸다.
해보니까 패킷을 20개 정도만 캡쳐해도 됐을 것이다.
이제 조금 더 패킷을 자세히 볼 수 있게 됐다!
iptables로 패킷 장난질이 마구 이뤄지다보니 제대로 보기는 힘든데(좀 더 좋게 보는 방법 아시는 분..), 대충 정리하자면 이렇다.
- curl 프로세스(48612)에서 요청 발생
- 이 요청은 사실 localhost로 15001포트를 열고 있는 엔보이에게 들어간다.
- 이건 파드 초기화 시 pilot-agent가 iptables로 장난질 쳐서 그렇다.
- tcp 연결이 먼저 이뤄지는데, 엔보이는 curl 프로세스 입장에서 catalog의 80번 포트에서 연결을 수락한 것마냥 잘 포장해서 보여준다.
- http 요청이 날아간다.
- 이 요청은 사실 localhost로 15001포트를 열고 있는 엔보이에게 들어간다.
- envoy가 파드 외부로 요청을 보낸다.
- 먼저 v1의 catalog에 요청(48756)
- 그리고 v2의 catalog에 요청(50600)
- 두 응답 모두 정상적으로 돌아온다.
- curl 프로세스 응답 반환
- envoy가 외부에서 응답이 온 것마냥 잘 포장해서 curl 프로세스(48612)로 트래픽을 돌려보낸다.
tcpdump가 수집되는 시점을 잘못 이해하고 작성된 글이다.
나중에 다시 정리해야할 것 같은데, 15001은 엔보이의 아웃바운드 핸들링 포트이다.
보다시피 미러링은 이뤄졌으나 실제 프로세스에게 돌려주는 응답은 v1, 즉 이미지 url 정보가 없는 응답 하나 뿐이란 것을 알 수 있다.
결론
미러링 기능을 처음 알게 됐을 때 응답을 버린다고 하길래 나는 아예 iptables에서 드랍을 시켜버리는 게 아닐까 생각했었는데, 조금 더 구체적으로 패킷을 뜯어보고 나서 어떤 식으로 동작하는지 알 수 있었다.
엔보이는 미러링을 해서 트래픽을 전달하고 응답까지 받으나, 그걸 원래 다운스트림으로 돌려주지 않을 뿐이다.
이 미러링과 비슷한 기능으로, 리퀘스트 헤징이라는 것이 있는데, 이것도 다음 글 정도에서 보게 될 것이다.
이전 글, 다음 글
다른 글 보기
이름 | index | noteType | created |
---|---|---|---|
1W - 서비스 메시와 이스티오 | 1 | published | 2025-04-10 |
1W - 간단한 장애 상황 구현 후 대응 실습 | 2 | published | 2025-04-10 |
1W - Gateway API를 활용한 설정 | 3 | published | 2025-04-10 |
1W - 네이티브 사이드카 컨테이너 이용 | 4 | published | 2025-04-10 |
2W - 엔보이 | 5 | published | 2025-04-19 |
2W - 인그레스 게이트웨이 실습 | 6 | published | 2025-04-17 |
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 | 7 | published | 2025-04-22 |
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 | 8 | published | 2025-04-22 |
3W - 트래픽 미러링 패킷 캡쳐 | 9 | published | 2025-04-22 |
3W - 서비스 엔트리와 이그레스 게이트웨이 | 10 | published | 2025-04-22 |
3W - 데스티네이션 룰을 활용한 네트워크 복원력 | 11 | published | 2025-04-26 |
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 | 12 | published | 2025-04-26 |
4W - 이스티오 메트릭 확인 | 13 | published | 2025-05-03 |
4W - 이스티오 메트릭 커스텀, 프로메테우스와 그라파나 | 14 | published | 2025-05-03 |
4W - 오픈텔레메트리 기반 트레이싱 예거 시각화, 키알리 시각화 | 15 | published | 2025-05-03 |
4W - 번외 - 트레이싱용 심플 메시 서버 개발 | 16 | published | 2025-05-03 |
5W - 이스티오 mTLS와 SPIFFE | 17 | published | 2025-05-11 |
5W - 이스티오 JWT 인증 | 18 | published | 2025-05-11 |
5W - 이스티오 인가 정책 설정 | 19 | published | 2025-05-11 |
6W - 이스티오 설정 트러블슈팅 | 20 | published | 2025-05-18 |
6W - 이스티오 컨트롤 플레인 성능 최적화 | 21 | published | 2025-05-18 |
8W - 가상머신 통합하기 | 22 | published | 2025-06-01 |
8W - 엔보이와 iptables 뜯어먹기 | 23 | published | 2025-06-01 |
9W - 앰비언트 모드 구조, 원리 | 24 | published | 2025-06-07 |
9W - 앰비언트 헬름 설치, 각종 리소스 실습 | 25 | published | 2025-06-07 |
7W - 이스티오 메시 스케일링 | 26 | published | 2025-06-09 |
7W - 엔보이 필터를 통한 기능 확장 | 27 | published | 2025-06-09 |
관련 문서
이름 | noteType | created |
---|---|---|
Istio Gateway | knowledge | 2025-04-16 |
Istio ServiceEntry | knowledge | 2025-04-17 |
Istio VirtualService | knowledge | 2025-04-21 |
Istio DestinationRule | knowledge | 2025-04-21 |
Istio Sidecar | knowledge | 2025-05-13 |
Istio ProxyConfig | knowledge | 2025-05-17 |
2W - 인그레스 게이트웨이 실습 | published | 2025-04-17 |
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 | published | 2025-04-22 |
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 | published | 2025-04-22 |
3W - 트래픽 미러링 패킷 캡쳐 | published | 2025-04-22 |
3W - 서비스 엔트리와 이그레스 게이트웨이 | published | 2025-04-22 |
3W - 데스티네이션 룰을 활용한 네트워크 복원력 | published | 2025-04-26 |
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 | published | 2025-04-26 |
6W - 이스티오 컨트롤 플레인 성능 최적화 | published | 2025-05-18 |
7W - 이스티오 메시 스케일링 | published | 2025-06-09 |
E-이스티오 컨트롤 플레인 성능 최적화 | topic/explain | 2025-05-18 |
E-이스티오 DNS 프록시 동작 | topic/explain | 2025-06-01 |
E-이스티오 메시 스케일링 | topic/explain | 2025-06-08 |